home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1994 Burra Gopal, Udi Manber. All Rights Reserved. */
-
- #include <stdio.h>
- #include <sys/types.h>
- #if DIRENT
- #include <dirent.h>
- #else /*DIRENT*/
- #include <sys/dir.h>
- #endif /*DIRENT*/
- #include <sys/stat.h>
- #include <fcntl.h>
- #define DIRSIZE 14
-
- #if 0
- #define FUNCTION(x, y, z) treewalk(x, y, z)
- #define MAX_LINE_LEN 1024
-
- main(argc, argv)
- int argc; char **argv;
- {
- char buf[MAX_LINE_LEN];
- char outbuf[MAX_LINE_LEN];
- int flags=0;
-
- if (argc == 1) {
- strcpy(buf, ".");
- return treewalk(buf, outbuf, flags);
- }
- else while(--argc > 0) {
- strcpy(buf, *++argv);
- return treewalk(buf, outbuf, flags);
- }
- }
-
- int
- treewalk(name, outname, flags)
- char *name;
- char *outname;
- int flags;
- {
- struct stat stbuf;
- extern int puts();
-
- if(lstat(name, &stbuf) == -1) {
- fprintf(stderr, "permission denied or non-existent: %s\n", name);
- return -1;
- }
- if ((stbuf.st_mode & S_IFMT) == S_IFLNK)
- return -1;
- if ((stbuf.st_mode & S_IFMT) == S_IFDIR)
- return DIRECTORY(name, outname, flags);
- if ((stbuf.st_mode & S_IFMT) == S_IFREG)
- return puts(name);
- }
- #endif /*0*/
-
- int
- DIRECTORY(name, outname, flags)
- char *name, *outname;
- int flags;
- {
- #if DIRENT
- struct dirent *dp;
- #else /*DIRENT*/
- struct direct *dp;
- #endif /*DIRENT*/
- char *nbp;
- DIR *dirp;
-
- nbp = name + strlen(name);
- if( nbp+DIRSIZE+2 >= name+MAX_LINE_LEN ) { /* name too long */
- fprintf(stderr, "name too long: %.32s...\n", name);
- return -1;
- }
- if((dirp = opendir(name)) == NULL) {
- fprintf(stderr, "permission denied: %s\n", name);
- return -1;
- }
- *nbp++ = '/';
- for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
- if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..")==0) {
- continue;
- }
- strcpy(nbp, dp->d_name);
- FUNCTION(name, outname, flags);
- }
- closedir (dirp);
- *--nbp = '\0'; /* restore name */
- return 0;
- }
-